// Environment Variables (环境变量) 示例
// 演示 Pascal 中环境变量处理的各种用法
program p_41_environment_variables;

{$mode objfpc}{$H+}
// {$mode objfpc} 启用 Object Pascal 模式
// {$H+} 启用长字符串支持（AnsiString）

// 引入单元文件
uses
  SysUtils,      // 系统工具单元
  Classes;       // 类单元

// 显示特定环境变量的值
procedure DisplayEnvironmentVariable(const VarName: String);
var
  value: String;
begin
  value := GetEnvironmentVariable(VarName);
  if value <> '' then
    WriteLn('  ', VarName, ' = ', value)
  else
    WriteLn('  ', VarName, ' = (未设置)');
end;

// 显示系统相关信息的环境变量
procedure DisplaySystemEnvironmentVariables;
begin
  WriteLn('1. 系统环境变量:');
  {$IFDEF WINDOWS}
    DisplayEnvironmentVariable('COMPUTERNAME');
    DisplayEnvironmentVariable('USERNAME');
    DisplayEnvironmentVariable('USERDOMAIN');
    DisplayEnvironmentVariable('OS');
    DisplayEnvironmentVariable('PROCESSOR_ARCHITECTURE');
    DisplayEnvironmentVariable('NUMBER_OF_PROCESSORS');
  {$ELSE}
    DisplayEnvironmentVariable('HOSTNAME');
    DisplayEnvironmentVariable('USER');
    DisplayEnvironmentVariable('HOME');
    DisplayEnvironmentVariable('SHELL');
    DisplayEnvironmentVariable('TERM');
  {$ENDIF}
end;

// 显示路径相关环境变量
procedure DisplayPathEnvironmentVariables;
begin
  WriteLn('2. 路径相关环境变量:');
  DisplayEnvironmentVariable('PATH');
  DisplayEnvironmentVariable('TEMP');
  DisplayEnvironmentVariable('TMP');
  
  {$IFDEF WINDOWS}
    DisplayEnvironmentVariable('SYSTEMROOT');
    DisplayEnvironmentVariable('PROGRAMFILES');
    DisplayEnvironmentVariable('APPDATA');
  {$ELSE}
    DisplayEnvironmentVariable('HOME');
    DisplayEnvironmentVariable('PWD');
  {$ENDIF}
end;

// 设置和获取自定义环境变量
procedure SetAndGetCustomEnvironmentVariables;
begin
  WriteLn('3. 自定义环境变量:');
  
  // 设置环境变量
  if SetEnvironmentVariable('MY_CUSTOM_VAR', 'Hello from Pascal') then
    WriteLn('  成功设置 MY_CUSTOM_VAR = Hello from Pascal')
  else
    WriteLn('  设置 MY_CUSTOM_VAR 失败');
  
  // 获取环境变量
  DisplayEnvironmentVariable('MY_CUSTOM_VAR');
  
  // 设置另一个环境变量
  if SetEnvironmentVariable('PASCAL_VERSION', '3.2.2') then
    WriteLn('  成功设置 PASCAL_VERSION = 3.2.2')
  else
    WriteLn('  设置 PASCAL_VERSION 失败');
  
  DisplayEnvironmentVariable('PASCAL_VERSION');
  
  // 修改已有的环境变量
  if SetEnvironmentVariable('MY_CUSTOM_VAR', 'Modified Value') then
    WriteLn('  成功修改 MY_CUSTOM_VAR = Modified Value')
  else
    WriteLn('  修改 MY_CUSTOM_VAR 失败');
  
  DisplayEnvironmentVariable('MY_CUSTOM_VAR');
end;

// 遍历所有环境变量
procedure ListAllEnvironmentVariables;
var
  i: Integer;
  envVar: String;
  equalPos: Integer;
  varName, varValue: String;
begin
  WriteLn('4. 所有环境变量 (前20个):');
  for i := 1 to EnvCount do
  begin
    envVar := GetEnvironmentString(i);
    equalPos := Pos('=', envVar);
    
    if equalPos > 0 then
    begin
      varName := Copy(envVar, 1, equalPos - 1);
      varValue := Copy(envVar, equalPos + 1, Length(envVar));
      
      WriteLn('  ', varName, ' = ', varValue);
    end
    else
      WriteLn('  ', envVar);
    
    // 限制输出数量，避免输出过多
    if i >= 20 then
    begin
      WriteLn('  ... (还有更多环境变量)');
      Break;
    end;
  end;
end;

// 环境变量与路径处理
procedure EnvironmentVariablesAndPathHandling;
var
  path: String;
  paths: TStringList;
  i: Integer;
begin
  WriteLn('5. 环境变量与路径处理:');
  path := GetEnvironmentVariable('PATH');
  
  if path <> '' then
  begin
    paths := TStringList.Create;
    try
      {$IFDEF WINDOWS}
        // Windows使用分号分隔
        paths.Delimiter := ';';
      {$ELSE}
        // Unix/Linux使用冒号分隔
        paths.Delimiter := ':';
      {$ENDIF}
      
      paths.StrictDelimiter := True;
      paths.DelimitedText := path;
      
      WriteLn('  PATH环境变量包含 ', paths.Count, ' 个路径:');
      for i := 0 to Min(10, paths.Count - 1) do
        WriteLn('    ', i + 1, '. ', paths[i]);
      
      if paths.Count > 10 then
        WriteLn('    ... (还有 ', paths.Count - 10, ' 个路径)');
    finally
      paths.Free;
    end;
  end
  else
    WriteLn('  未找到PATH环境变量');
end;

// 环境变量的安全使用
procedure SecureEnvironmentVariableUsage;
var
  sensitiveData: String;
begin
  WriteLn('6. 环境变量的安全使用:');
  
  // 模拟敏感数据处理
  sensitiveData := 'SECRET_KEY_12345';
  
  // 设置敏感环境变量
  if SetEnvironmentVariable('SECRET_KEY', sensitiveData) then
    WriteLn('  成功设置敏感环境变量 SECRET_KEY')
  else
    WriteLn('  设置敏感环境变量失败');
  
  // 获取敏感环境变量
  var retrievedKey: String := GetEnvironmentVariable('SECRET_KEY');
  if retrievedKey <> '' then
    WriteLn('  成功获取敏感环境变量，长度: ', Length(retrievedKey), ' 字符')
  else
    WriteLn('  获取敏感环境变量失败');
  
  // 清理敏感数据
  if SetEnvironmentVariable('SECRET_KEY', '') then
    WriteLn('  已清理敏感环境变量')
  else
    WriteLn('  清理敏感环境变量失败');
end;

// 程序主入口
begin
  WriteLn('=== Pascal 环境变量示例 ===');
  WriteLn;
  
  // 1. 显示系统环境变量
  DisplaySystemEnvironmentVariables;
  
  WriteLn;
  
  // 2. 显示路径相关环境变量
  DisplayPathEnvironmentVariables;
  
  WriteLn;
  
  // 3. 设置和获取自定义环境变量
  SetAndGetCustomEnvironmentVariables;
  
  WriteLn;
  
  // 4. 遍历所有环境变量
  ListAllEnvironmentVariables;
  
  WriteLn;
  
  // 5. 环境变量与路径处理
  EnvironmentVariablesAndPathHandling;
  
  WriteLn;
  
  // 6. 环境变量的安全使用
  SecureEnvironmentVariableUsage;
  
  WriteLn;
  WriteLn('演示了 Pascal 中环境变量处理的各种用法');
  
  // 等待用户按键，防止程序窗口立即关闭
  ReadLn;
end.